package com.ruoyi.site.service.impl;

import java.math.BigDecimal;
import java.util.List;
import java.util.Date;

import com.ruoyi.site.service.ISfxService;
import com.ruoyi.site.service.ITracksService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ruoyi.site.mapper.CartItemsMapper;
import com.ruoyi.site.domain.CartItems;
import com.ruoyi.site.service.ICartItemsService;
import org.springframework.transaction.annotation.Transactional;

/**
 * 购物车项目Service业务层处理
 *
 * @author chuckeytang
 * @date 2025-10-13
 */
@Service
public class CartItemsServiceImpl implements ICartItemsService
{
    @Autowired
    private CartItemsMapper cartItemsMapper;

    @Autowired
    private ITracksService tracksService;

    @Autowired
    private ISfxService sfxService;

    /**
     * 查询购物车项目
     */
    @Override
    public CartItems selectCartItemsByCartItemId(Long cartItemId)
    {
        return cartItemsMapper.selectCartItemsByCartItemId(cartItemId);
    }

    /**
     * 根据购物车ID和产品信息查询购物车项目 (用于判断是否已存在)
     */
    @Override
    public CartItems selectCartItemByProduct(Long cartId, String productType, Long productId, String licenseOption) {
        return cartItemsMapper.selectCartItemByProduct(cartId, productType, productId, licenseOption);
    }

    /**
     * 查询购物车项目列表
     */
    @Override
    public List<CartItems> selectCartItemsList(CartItems cartItems)
    {
        return cartItemsMapper.selectCartItemsList(cartItems);
    }

    /**
     * 根据购物车ID查询购物车项目列表
     */
    @Override
    public List<CartItems> selectCartItemsListByCartId(Long cartId) {
        return cartItemsMapper.selectCartItemsListByCartId(cartId);
    }

    /**
     * 修改购物车项目
     */
    @Override
    public int updateCartItems(CartItems cartItems)
    {
        return cartItemsMapper.updateCartItems(cartItems);
    }

    /**
     * 批量删除购物车项目
     */
    @Override
    public int deleteCartItemsByCartItemIds(Long[] cartItemIds)
    {
        return cartItemsMapper.deleteCartItemsByCartItemIds(cartItemIds);
    }

    /**
     * 删除购物车项目信息
     */
    @Override
    public int deleteCartItemsByCartItemId(Long cartItemId)
    {
        return cartItemsMapper.deleteCartItemsByCartItemId(cartItemId);
    }

    @Override
    public int deleteCartItemsByCartId(Long cartId)
    {
        return cartItemsMapper.deleteCartItemsByCartId(cartId);
    }

    /**
     * 辅助方法：根据产品信息获取当前价格
     */
    private BigDecimal getProductPrice(String productType, Long productId, String licenseOption) {
        // 简化：目前只支持 'standard' licenseOption，且只返回标准价格
        if ("track".equalsIgnoreCase(productType)) {
            return tracksService.getStandardPriceByTrackId(productId);
        } else if ("sfx".equalsIgnoreCase(productType)) {
            return sfxService.getStandardPriceBySfxId(productId);
        }
        return BigDecimal.ZERO; // 未知产品或免费
    }

    /**
     * 新增购物车项目
     */
    @Override
    @Transactional // 确保查询价格和插入是原子操作
    public int insertCartItems(CartItems cartItems)
    {
        if (cartItems.getAddedAt() == null) {
            cartItems.setAddedAt(new Date());
        }

        // 1. 获取产品价格
        BigDecimal price = getProductPrice(cartItems.getProductType(), cartItems.getProductId(), cartItems.getLicenseOption());

        if (price == null || price.compareTo(BigDecimal.ZERO) <= 0) {
            // 价格无效或免费产品不需要添加到购物车（取决于业务规则）
            throw new RuntimeException("产品价格无效或无法获取");
        }

        // 2. 设置价格和时间戳
        cartItems.setPriceAtAddition(price);
        if (cartItems.getAddedAt() == null) {
            cartItems.setAddedAt(new Date());
        }

        // 3. 执行插入
        return cartItemsMapper.insertCartItems(cartItems);
    }
}